package com.ts.api.http.org.biz;

import com.alibaba.fastjson.JSONObject;
import com.gitee.apanlh.util.algorithm.encrypt.symmetric.AES;
import com.gitee.apanlh.util.base.ChooseEq;
import com.gitee.apanlh.util.base.Eq;
import com.gitee.apanlh.util.base.MapUtils;
import com.gitee.apanlh.util.dataformat.JsonUtils;
import com.ts.api.http.org.entity.apply.OrgApplyZhuMaDianDaiLaiQian;
import com.ts.api.module.api.convert.core.annotation.ApiPlan;
import com.ts.api.module.api.convert.core.annotation.ApiPlanConvertType;
import com.ts.api.module.api.convert.core.entity.ApiApplyParameter;
import com.ts.api.module.api.convert.core.entity.ApiDataExchangeParameter;
import com.ts.api.module.api.convert.core.utils.ApiFieldConverter;
import com.ts.api.module.api.convert.org.handler.ApiOrgPhoneMd5ConvertHandler;
import com.ts.api.module.api.convert.org.model.RespOrgPhoneMd5Apply;
import com.ts.api.module.api.convert.org.model.RespOrgPhoneMd5DataExchange;

import java.util.Map;

/**
 * 安心分期-驻马店贷来钱-全量25api
 *
 * @author 李源聪
 */
@ApiPlan(productId = "153", type = ApiPlanConvertType.ORG_PHONE_MD5)
public class ApiOrgPhoneMd5ZhuMaDianDaiLaiQian implements ApiOrgPhoneMd5ConvertHandler {
    private static final String SOURCE_CODE = "103678";
    private static final String ACCESS_KEY = "422BDCE6-67C7-4FF9-8E09-08D161EA40DE";
    private static final String KEY = "I10CSN4OJHCMNQEU";
    private static final String IV = "9XR1X8K7541TOI5S";

    @Override
    public Object dataExchange(ApiDataExchangeParameter apiDataExchangeParameter) throws Exception {
        Map<Object, Object> map = MapUtils.newHashMap(newMap -> {
            newMap.put("sourceCode", SOURCE_CODE);
            newMap.put("accessKey", ACCESS_KEY);
            newMap.put("phoneMd5", apiDataExchangeParameter.getPhoneMd5());
        });
        return JsonUtils.toJson(map);
    }

    @Override
    public RespOrgPhoneMd5DataExchange respDataExchange(String respJson) throws Exception {
        JSONObject jsonObject = JsonUtils.get(respJson);
        if (jsonObject == null) {
            return RespOrgPhoneMd5DataExchange.ofFail();
        }
        if (!Eq.object(jsonObject.getInteger("code"), 1)) {
            return RespOrgPhoneMd5DataExchange.ofFail();
        }
        JSONObject data = jsonObject.getJSONObject("data");
        if (data == null) {
            return RespOrgPhoneMd5DataExchange.ofFail();
        }
        if (data.getBoolean("phoneMd5Exist")) {
            return RespOrgPhoneMd5DataExchange.ofFail();
        }
        return RespOrgPhoneMd5DataExchange.ofSuc();
    }

    @Override
    public Object apply(ApiApplyParameter apiApplyParameter) throws Exception {
        OrgApplyZhuMaDianDaiLaiQian apiOrgPhoneMd5ZhuMaDianDaiLaiQian = new OrgApplyZhuMaDianDaiLaiQian();
        applyFieldMapping(apiApplyParameter, apiOrgPhoneMd5ZhuMaDianDaiLaiQian);
        String json = JsonUtils.toJson(apiOrgPhoneMd5ZhuMaDianDaiLaiQian);
        AES cbc = AES.createCbc(KEY.getBytes(), IV.getBytes());
        return MapUtils.newHashMap(newMap -> {
            newMap.put("sourceCode", SOURCE_CODE);
            newMap.put("accessKey", ACCESS_KEY);
            newMap.put("dataStr", cbc.encryptToBase64Str(json));
        });
    }

    @Override
    public RespOrgPhoneMd5Apply respApply(String respJson) throws Exception {
        JSONObject jsonObject = JsonUtils.get(respJson);
        if (jsonObject == null) {
            return RespOrgPhoneMd5Apply.ofFail();
        }
        if (!Eq.object(jsonObject.getInteger("code"), 1)) {
            return RespOrgPhoneMd5Apply.ofFail();
        }
        return RespOrgPhoneMd5Apply.ofSuc();
    }

    private void applyFieldMapping(ApiApplyParameter apiApplyParameter, OrgApplyZhuMaDianDaiLaiQian orgApply) {
        //  获取封装字段转换器
        ApiFieldConverter apiFieldConverter = ApiFieldConverter.create(apiApplyParameter);

        orgApply.setRealName(apiApplyParameter.getUserName());

        orgApply.setPhone(apiApplyParameter.getPhone());

        //  获取年龄-自行根据文档中的类型
        String age = apiFieldConverter.getAge();
        orgApply.setAge(age);

        //  城市/默认带市
        String sourceCity = apiApplyParameter.getCity();

        orgApply.setCity(sourceCity);

        //  性别-要获取中文性别（男/女）使用apiFieldConverter.getSexText
        String sex = ChooseEq.create(apiApplyParameter.getSex())
                .when("0", "1")
                .when("1", "0")
                .end();
        orgApply.setSex(sex);

        /*
           我方字典-职业
           1.上班族
           2.自由职业
           3.企业主（有营业执照）
           4.公务员或事业单位
           如果对方需要"文字形式"如:上班族/公务员或事业单位,使用apiFieldConverter.getCareerText
           如果对方需要"有无职业或者是否有工作"如:有/无，使用使用apiFieldConverter.hasCareerToStr
           如果对方需要"有无职业或者是否有工作"如:0/1，使用使用apiFieldConverter.hasCareerToNumber
         */
        String career = ChooseEq.create(apiApplyParameter.getCareer())
                .when("1", "1")
                .when("2", "4")
                .when("3", "2")
                .when("4", "5")
                .when("5", "3")
                .end();
        orgApply.setCareer(career);

       /*
          我方字典-工资发放形式/银行代发/打卡方式
          1.银行代发打卡
          2.现金收入
          3.个人转账
          如果对方只需要"银行代发-有/无"使用:apiFieldConverter.hasSalaryBankToStr
          如果对方只需要"银行代发-是/否"使用:apiFieldConverter.hasSalaryBankChooseToStr
          如果对方只需要"银行代发-0/1"使用:apiFieldConverter.hasSalaryBankToNumber
        */
        String salaryPayMethod = ChooseEq.create(apiApplyParameter.getSalaryPayMethod())
                .when("1", "3")
                .when("2", "1")
                .when("3", "2")
                .end();
        orgApply.setSalaryPayMethod(salaryPayMethod);

        /*
           我方字典-芝麻分
           1.600分以下
           2.600~649分
           3.650~699分
           4.700分以上
           如果对方需要"分值形式"如:650，700,使用apiFieldConverter.getSesameCreditNumber/getSesameCreditStr
           如果对方要"文字形式"如:600分以下,600~649分,使用apiFieldConverter.getSesameCreditText
         */
        String sesameCredit = ChooseEq.create(apiApplyParameter.getSesameCredit())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .when("4", "4")
                .end();
        orgApply.setSesameCredit(sesameCredit);

        /*
          我方字典-借款用途
          1.旅游
          2.教育
          3.婚庆
          4.装修
          5.医疗
          6.个人消费
        */
        String loanPurpose = ChooseEq.create(apiApplyParameter.getLoanPurpose())
                .when("1", "6")
                .when("2", "8")
                .when("3", "5")
                .when("4", "3")
                .when("5", "7")
                .when("6", "9")
                .end();
        orgApply.setLoanPurpose(loanPurpose);

        /*
          我方字典-公积金
          1.无公积金
          2.缴纳6个月以下
          3.缴纳6个月以上
          4.有公积金
          如果对方只需要"有/无"使用:apiFieldConverter.hasProvidentFundToStr
          如果对方只需要"0/1"使用:apiFieldConverter.hasProvidentFundToNumber
        */
        String providentFund = ChooseEq.create(apiApplyParameter.getProvidentFund())
                .when("1", "0")
                .when("2", "1")
                .when("3", "2")
                .when("4", "1")
                .end();
        orgApply.setProvidentFund(providentFund);

        /*
          我方字典-社保缴纳
          1.无社保
          2.缴纳6个月以下
          3.缴纳6个月以上
          4.有社保
          如果对方需要"有无社保情况"如:有/无，使用使用apiFieldConverter.hasSocialSecurityToStr
          如果对方需要"有无社保情况"如:0/1，使用使用apiFieldConverter.hasSocialSecurityToNumber
        */
        String socialSecurity = ChooseEq.create(apiApplyParameter.getSocialSecurity())
                .when("1", "0")
                .when("2", "1")
                .when("3", "2")
                .when("4", "1")
                .end();
        orgApply.setSocialSecurity(socialSecurity);

        /*
          我方字典-房产情况
          1.无房产
          2.有房不抵押
          3.有房可抵押
          4.有房产
          5.有按揭房产
          6.有全款房产
          如果对方需要"有无月收入"如:有/无，使用使用apiFieldConverter.hasRealEstateInfoToStr
          如果对方需要"有无月收入"如:0/1，使用使用apiFieldConverter.hasRealEstateInfoToNumber
        */
        String realEstateInfo = ChooseEq.create(apiApplyParameter.getRealEstateInfo())
                .when("1", "0")
                .when("2", "1")
                .when("3", "2")
                .when("4", "2")
                .when("5", "2")
                .when("6", "2")
                .end();
        orgApply.setRealEstateInfo(realEstateInfo);

        /*
           我方字典-车辆情况
           1.无车产
           2.有车不抵押
           3.有车可抵押
           4.有车
           如果对方文档是需要返回"0"和"1" 使用:apiFieldConverter.hasCarInfoToNumber
           如果对方文档是需要返回"有"和"无",使用:apiFieldConverter.hasCarInfoToStr
         */
        String carInfo = ChooseEq.create(apiApplyParameter.getCarInfo())
                .when("1", "0")
                .when("2", "2")
                .when("3", "1")
                .when("4", "1")
                .end();
        orgApply.setCarInfo(carInfo);

       /*
            我方字典-保险保单
            1.无保险保单
            2.缴纳未满1年
            3.缴纳1年以上
            4.有保险保单
            如果对方只需要"有/无"使用:apiFieldConverter.hasInsurancePolicyToStr
            如果对方只需要"0/1"使用:apiFieldConverter.hasInsurancePolicyToNumber
        */
        String insurancePolicy = ChooseEq.create(apiApplyParameter.getInsurancePolicy())
                .when("1", "0")
                .when("2", "1")
                .when("3", "2")
                .when("4", "1")
                .end();
        orgApply.setInsurancePolicy(insurancePolicy);

        /*
           我方字典-信用情况（逾期）
           1.无逾期
           2.当前有逾期
           3.一年以内无逾期
           如果对方文档是需要返回"0"和"1" 使用:apiFieldConverter.hasOverdueToNumber
           如果对方文档是需要返回"有"和"无",使用:apiFieldConverter.hasOverdueToStr方法
         */
        String overdue = ChooseEq.create(apiApplyParameter.getOverdue())
                .when("1", "1")
                .when("2", "5")
                .when("3", "6")
                .end();
        orgApply.setOverdue(overdue);

        /*
          我方字典-单位工龄
          1.0-6个月
          2.6-12个月
          3.12个月以上
        */
        String yearsService = ChooseEq.create(apiApplyParameter.getYearsService())
                .when("1", "1")
                .when("2", "2")
                .when("3", "3")
                .end();
        orgApply.setYearsService(yearsService);

       /*
          营业执照注册年限
          1.未注册
          2.注册1年以下
          3.注册1~5年
          4.注册5年以上
       */
        String bizLicenseYear = ChooseEq.create(apiApplyParameter.getBizLicenseYear())
                .when("1", "0")
                .when("2", "1")
                .when("3", "2")
                .when("4", "3")
                .end();
        orgApply.setBizLicenseYear(bizLicenseYear);

        /*
          我方字典-学历
          1.初中及以下
          2.中专
          3.高中
          4.大专
          5.本科
          6.研究生及以上
        */
        String educationAttainment = ChooseEq.create(apiApplyParameter.getEducationAttainment())
                .when("1", "1")
                .when("2", "1")
                .when("3", "1")
                .when("4", "2")
                .when("5", "3")
                .when("6", "4")
                .end();
        orgApply.setEducationAttainment(educationAttainment);

        orgApply.setRemarks(apiFieldConverter.getExtendInfo());

    }

}
